﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Nlnet.Avalonia.Controls;
using OfficeOpenXml;
using Range = OfficeOpenXml.ExcelRange;

namespace 畜牧业审核程序国产.Models.PreReview
{
    internal class Cow : Animal
    {
        public Cow()
        {
            调查户编码所在行 = 4;
            调查户编码所在列 = 1;
            开始行 = 9;
            结束行 = 26;
            填报指标数量 = 18;
            村信息所在行 = 15;
            村信息所在列 = 2;
            时点数结束行 = 13;
        }

        public override string MandatoryReview(ExcelWorksheet sht)
        {
            try
            {
                base.本月及上季末月指标空值转成0并所有单元格全部居中(sht);
                base.恢复单元格颜色并删除注释(sht);
                var 户编码 = GetFarmCode(sht, 2, 1);
                for (int i = 3; i > 0; i--)
                {


                    int 正在审核的列 = 本季度数据所在列 - i;
                    Range rng月末存栏 = sht.Cells[开始行, 正在审核的列];
                    Range rng月末肉牛存栏 = sht.Cells[开始行 + 1, 正在审核的列];
                    Range rng月末能繁殖母牛存栏 = sht.Cells[开始行 + 2, 正在审核的列];
                    Range rng月末奶牛存栏 = sht.Cells[开始行 + 3, 正在审核的列];
                    Range rng月末在产奶牛存栏 = sht.Cells[开始行 + 4, 正在审核的列];
                    Range rng当月增加头数 = sht.Cells[开始行 + 5, 正在审核的列];
                    Range rng当月自繁头数 = sht.Cells[开始行 + 6, 正在审核的列];
                    Range rng当月自繁肉牛头数 = sht.Cells[开始行 + 7, 正在审核的列];
                    Range rng当月自繁奶牛头数 = sht.Cells[开始行 + 8, 正在审核的列];
                    Range rng当月购进头数 = sht.Cells[开始行 + 9, 正在审核的列];
                    Range rng当月购进肉牛头数 = sht.Cells[开始行 + 10, 正在审核的列];
                    Range rng当月购进奶牛头数 = sht.Cells[开始行 + 11, 正在审核的列];
                    Range rng当月减少头数 = sht.Cells[开始行 + 12, 正在审核的列];
                    Range rng当月自宰肉牛头数 = sht.Cells[开始行 + 13, 正在审核的列];
                    Range rng当月出售肉牛头数 = sht.Cells[开始行 + 14, 正在审核的列];
                    Range rng当月出售肉牛金额 = sht.Cells[开始行 + 15, 正在审核的列];
                    Range rng当月出售肉牛重量 = sht.Cells[开始行 + 16, 正在审核的列];
                    Range rng当月生牛奶产量 = sht.Cells[开始行 + 17, 正在审核的列];

                    #region 2.表内指标 ①　期末存栏≠肉牛+奶牛


                    if (Convert.ToDouble(rng月末存栏.Value) !=
                        Convert.ToDouble(rng月末肉牛存栏.Value) + Convert.ToDouble(rng月末奶牛存栏.Value))
                    {
                        string 提示信息 = "期末存栏应该等于肉牛数与奶牛数之和!";
                        //List<Range> rngs = new List<Range>() { rng本月期末存栏, rng25公斤以下仔猪存栏, rng种猪存栏, rng待育肥猪存栏 };
                        //foreach (var rng in rngs)
                        //{
                        //    rng.Interior.ColorIndex = 3;
                        //    rng.AddComment(提示信息);
                        //}
                        Range[] ranges = new Range[] { rng月末存栏, rng月末肉牛存栏, rng月末奶牛存栏 };
                        base.错误单元格标注成红色并加注释(提示信息, sht, ranges);

                    }

                    #endregion

                    #region ② 肉牛期末存栏<能繁殖母牛存栏

                    if (Convert.ToDouble( rng月末肉牛存栏.Value) < Convert.ToDouble(rng月末能繁殖母牛存栏.Value))
                    {
                        string 提示信息 = "期末存栏肉牛数量应大于等于能繁殖母牛存栏";
                        Range[] ranges = { rng月末肉牛存栏, rng月末能繁殖母牛存栏 };
                        base.错误单元格标注成红色并加注释(提示信息, sht, ranges);
                    }

                    #endregion

                    #region ③奶牛期末存栏<在产奶牛数量

                    if (Convert.ToDouble(rng月末奶牛存栏.Value) < Convert.ToDouble(rng月末在产奶牛存栏.Value))
                    {
                        string 提示信息 = "期末存栏奶牛数量应大于等于在产奶牛数量";
                        Range[] rngs = new Range[] { rng月末奶牛存栏, rng月末在产奶牛存栏 };
                        base.错误单元格标注成红色并加注释(提示信息, sht, rngs);
                    }


                    #endregion

                    #region ④期内增加!=自繁+购进

                    if (Convert.ToDouble(rng当月增加头数.Value) !=
                        Convert.ToDouble(rng当月自繁头数.Value) + Convert.ToDouble(rng当月购进头数.Value))
                    {
                        string 提示信息 = "期内增加数量应等于自繁、购进之和";
                        Range[] ranges = new Range[] { rng当月增加头数, rng当月自繁头数, rng当月购进头数 };
                        base.错误单元格标注成红色并加注释(提示信息, sht, ranges);

                    }

                    #endregion

                    #region ⑤　自繁头数≠自繁肉牛+自繁奶牛

                    if (Convert.ToDouble(rng当月自繁头数.Value) !=
                        Convert.ToDouble(rng当月自繁肉牛头数.Value) + Convert.ToDouble(rng当月自繁奶牛头数.Value))
                    {
                        string 提示信息 = "期内增加的自繁牛数量应等于肉牛与奶牛之和";
                        Range[] ranges = new Range[] { rng当月自繁头数, rng当月自繁肉牛头数, rng当月自繁奶牛头数 };
                        base.错误单元格标注成红色并加注释(提示信息, sht, ranges);
                    }

                    #endregion

                    #region ⑥　购进头数≠购进肉牛+购进奶牛

                    if (Convert.ToDouble(rng当月购进头数.Value) !=
                        Convert.ToDouble(rng当月购进肉牛头数.Value) + Convert.ToDouble(rng当月购进奶牛头数.Value))
                    {
                        string 提示信息 = "期内增加购进数量应等于肉牛与奶牛之和";
                        Range[] ranges = new Range[] { rng当月购进头数, rng当月购进肉牛头数, rng当月购进奶牛头数 };
                        base.错误单元格标注成红色并加注释(提示信息, sht, ranges);
                    }

                    #endregion

                    #region ⑦　期内减少头数<自宰肉牛数量+出售肉牛数量

                    if (Convert.ToDouble(rng当月减少头数.Value) <
                        Convert.ToDouble(rng当月自宰肉牛头数.Value) + Convert.ToDouble(rng当月出售肉牛头数.Value))
                    {
                        string 提示信息 = "期内减少数量应大于等于自宰肉牛数量、出售肉牛数量之和";
                        Range[] ranges = new Range[] { rng当月减少头数, rng当月自宰肉牛头数, rng当月出售肉牛头数 };
                        base.错误单元格标注成红色并加注释(提示信息, sht, ranges);

                    }

                    #endregion

                    #region ⑧　若出售肉牛数量=0，出售肉牛金额≠0，出售肉牛重量≠0

                    if (Convert.ToDouble(rng当月出售肉牛头数.Value) + Convert.ToDouble(rng当月出售肉牛金额.Value) +
                        Convert.ToDouble(rng当月出售肉牛重量.Value) > 0 &&
                        Convert.ToDouble(rng当月出售肉牛头数.Value) * Convert.ToDouble(rng当月出售肉牛金额.Value) *
                        Convert.ToDouble(rng当月出售肉牛重量.Value) == 0)
                    {
                        string 提示信息 = "如果有肉牛出售,出售肉牛数量、金额、重量至少有一个指标漏填";
                        Range[] ranges = new Range[] { rng当月出售肉牛头数, rng当月出售肉牛金额, rng当月出售肉牛重量 };
                        base.错误单元格标注成红色并加注释(提示信息, sht, ranges);
                    }

                    #endregion


                    #region 1.月度间平衡 本月存栏 !=上月末存栏+本月期内增加-本月期内减少




                    //if ((double)rng月末存栏.Value != 0 || rng当月增加头数.Value != 0 || rng当月减少头数.Value != 0)//本月如果为空,就不审核这个内容了
                    //{



                    Range rng上月末存栏;
                    if (i == 3 && _seasonNow != 1)
                    {
                        rng上月末存栏 = sht.Cells[开始行, 上季度数据所在列 - 1];
                    }
                    else
                    {
                        rng上月末存栏 = sht.Cells[开始行, 本季度数据所在列 - (i + 1)];
                    }

                    if (Convert.ToDouble(rng月末存栏.Value) !=
                        Convert.ToDouble(rng上月末存栏.Value) + Convert.ToDouble(rng当月增加头数.Value) -
                        Convert.ToDouble(rng当月减少头数.Value))
                    {
                        string 提示信息 = "本月存栏应等于上月末存栏+本月期内增加-本月期内减少";

                        Range[] ranges = new Range[] { rng上月末存栏, rng月末存栏, rng当月增加头数, rng当月减少头数 };
                        base.错误单元格标注成红色并加注释(提示信息, sht, ranges);

                    }


                    //else
                    //{
                    //    string 月份 = sht.Cells[开始行 - 2, 正在审核的列].Value.ToString();
                    //    MessageBox.Show($"{月份}数据为空,暂时不审“本月存栏应等于上月末存栏+本月期内增加-本月期内减少”错误", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    //}

                    #endregion
                   
                }
                //季度审核
                //季度审核
                Range rng季末存栏 = sht.Cells[开始行, 本季度数据所在列];
                Range rng季末肉牛存栏 = sht.Cells[开始行 + 1, 本季度数据所在列];
                Range rng季末能繁殖母牛存栏 = sht.Cells[开始行 + 2, 本季度数据所在列];
                Range rng季末奶牛存栏 = sht.Cells[开始行 + 3, 本季度数据所在列];
                Range rng季末在产奶牛存栏 = sht.Cells[开始行 + 4, 本季度数据所在列];
                Range rng当季增加头数 = sht.Cells[开始行 + 5, 本季度数据所在列];
                Range rng当季自繁头数 = sht.Cells[开始行 + 6, 本季度数据所在列];
                Range rng当季自繁肉牛头数 = sht.Cells[开始行 + 7, 本季度数据所在列];
                Range rng当季自繁奶牛头数 = sht.Cells[开始行 + 8, 本季度数据所在列];
                Range rng当季购进头数 = sht.Cells[开始行 + 9, 本季度数据所在列];
                Range rng当季购进肉牛头数 = sht.Cells[开始行 + 10, 本季度数据所在列];
                Range rng当季购进奶牛头数 = sht.Cells[开始行 + 11, 本季度数据所在列];
                Range rng当季减少头数 = sht.Cells[开始行 + 12, 本季度数据所在列];
                Range rng当季自宰肉牛头数 = sht.Cells[开始行 + 13, 本季度数据所在列];
                Range rng当季出售肉牛头数 = sht.Cells[开始行 + 14, 本季度数据所在列];
                Range rng当季出售肉牛金额 = sht.Cells[开始行 + 15, 本季度数据所在列];
                Range rng当季出售肉牛重量 = sht.Cells[开始行 + 16, 本季度数据所在列];
                Range rng当季生牛奶产量 = sht.Cells[开始行 + 17, 本季度数据所在列];

                #region 2.表内指标 ①　期末存栏≠肉牛+奶牛


                if (Convert.ToDouble(rng季末存栏.Value) != Convert.ToDouble(rng季末肉牛存栏.Value) + Convert.ToDouble(rng季末奶牛存栏.Value))
                {
                    string 提示信息 = "期末存栏应该等于肉牛数与奶牛数之和!";

                    Range[] ranges = new Range[] { rng季末存栏, rng季末肉牛存栏, rng季末奶牛存栏 };
                    base.错误单元格标注成红色并加注释(提示信息,sht, ranges);
                    
                }
                #endregion
                #region ② 肉牛期末存栏<能繁殖母牛存栏

                if (Convert.ToDouble( rng季末肉牛存栏.Value) < Convert.ToDouble(rng季末能繁殖母牛存栏.Value))
                {
                    string 提示信息 = "期末存栏肉牛数量应大于等于能繁殖母牛存栏";
                    Range[] ranges =new Range[] { rng季末肉牛存栏, rng季末能繁殖母牛存栏 };
                    base.错误单元格标注成红色并加注释(提示信息, sht, ranges);
                }
                #endregion
                #region ③奶牛期末存栏<在产奶牛数量

                if (Convert.ToDouble(rng季末奶牛存栏.Value) < Convert.ToDouble(rng季末在产奶牛存栏.Value))
                {
                    string 提示信息 = "期末存栏奶牛数量应大于等于在产奶牛数量";
                    Range[] rngs = new Range[] { rng季末奶牛存栏, rng季末在产奶牛存栏 };
                    base.错误单元格标注成红色并加注释(提示信息,sht, rngs);
                   
                }


                #endregion
                #region ④期内增加!=自繁+购进

                if (Convert.ToDouble(rng当季增加头数.Value) != Convert.ToDouble(rng当季自繁头数.Value) + Convert.ToDouble(rng当季购进头数.Value))
                {
                    string 提示信息 = "期内增加数量应等于自繁、购进之和";
                    Range[] ranges = new Range[] { rng当季增加头数, rng当季自繁头数, rng当季购进头数 };
                    base.错误单元格标注成红色并加注释(提示信息,sht, ranges);
                   
                }
                #endregion
                #region ⑤　自繁头数≠自繁肉牛+自繁奶牛

                if (Convert.ToDouble(rng当季自繁头数.Value) != Convert.ToDouble(rng当季自繁肉牛头数.Value) + Convert.ToDouble(rng当季自繁奶牛头数.Value))
                {
                    string 提示信息 = "期内增加的自繁牛数量应等于肉牛与奶牛之和";
                    Range[] ranges = new Range[] { rng当季自繁头数, rng当季自繁肉牛头数, rng当季自繁奶牛头数 };
                    base.错误单元格标注成红色并加注释(提示信息,sht, ranges);
                   
                }

                #endregion
                #region ⑥　购进头数≠购进肉牛+购进奶牛

                if (Convert.ToDouble(rng当季购进头数.Value) != Convert.ToDouble(rng当季购进肉牛头数.Value) + Convert.ToDouble(rng当季购进奶牛头数.Value))
                {
                    string 提示信息 = "期内增加购进数量应等于肉牛与奶牛之和";
                    Range[] ranges = new Range[] { rng当季购进头数, rng当季购进肉牛头数, rng当季购进奶牛头数 };
                    base.错误单元格标注成红色并加注释(提示信息,sht, ranges);
                   
                }
                #endregion
                #region ⑦　期内减少头数<自宰肉牛数量+出售肉牛数量

                if (Convert.ToDouble(rng当季减少头数.Value) < Convert.ToDouble(rng当季自宰肉牛头数.Value) + Convert.ToDouble(rng当季出售肉牛头数.Value))
                {
                    string 提示信息 = "期内减少数量应大于等于自宰肉牛数量、出售肉牛数量之和";
                    Range[] ranges = new Range[] { rng当季减少头数, rng当季自宰肉牛头数, rng当季出售肉牛头数 };
                    base.错误单元格标注成红色并加注释(提示信息,sht, ranges);
                    
                }
                #endregion
                #region ⑧　若出售肉牛数量=0，出售肉牛金额≠0，出售肉牛重量≠0

                if (Convert.ToDouble(rng当季出售肉牛头数.Value) + Convert.ToDouble(rng当季出售肉牛金额.Value) + Convert.ToDouble(rng当季出售肉牛重量.Value) > 0 &&
                    Convert.ToDouble(rng当季出售肉牛头数.Value) * Convert.ToDouble(rng当季出售肉牛金额.Value) * Convert.ToDouble(rng当季出售肉牛重量.Value) == 0)
                {
                    string 提示信息 = "如果有肉牛出售,出售肉牛数量、金额、重量至少有一个指标漏填";
                    Range[] ranges = new Range[] { rng当季出售肉牛头数, rng当季出售肉牛金额, rng当季出售肉牛重量 };
                    base.错误单元格标注成红色并加注释(提示信息,sht, ranges);
                  
                }
                #endregion


                #region 1.季度间平衡 本季存栏 !=上季末存栏+本季期内增加-本季期内减少



                Range rng上季末存栏;

                rng上季末存栏 = sht.Cells[开始行, 上季度数据所在列];


                if (Convert.ToDouble(rng季末存栏.Value) != Convert.ToDouble(rng上季末存栏.Value) + Convert.ToDouble(rng当季增加头数.Value) - Convert.ToDouble(rng当季减少头数.Value))
                {
                    string 提示信息 = "本季存栏应等于上季末存栏+本季期内增加-本季期内减少";

                    Range[] ranges = new Range[] { rng上季末存栏, rng季末存栏, rng当季增加头数, rng当季减少头数 };
                    base.错误单元格标注成红色并加注释(提示信息,sht, ranges);
                    
                }

                #endregion

                return null;
            }
            catch (Exception e)
            {
                return e.Message;
            }
        }

        public override void VerificationReview(ExcelWorksheet sht)
        {
            base.核实性说明标题填写(sht);
            List<string> ListSTR_核实性错误内容 = new List<string>();
            //接下去先审核,并把错误写到一个集合中或字典中
            for (int i = 3; i > 0; i--)//从这个季度的最左边的单元格开始
            {
                int 正在审核的列 = 本季度数据所在列 - i;
                Range rng月末存栏 = sht.Cells[开始行, 正在审核的列];
                Range rng月末肉牛存栏 = sht.Cells[开始行 + 1, 正在审核的列]; ;
                Range rng月末能繁殖母牛存栏 = sht.Cells[开始行 + 2, 正在审核的列];
                Range rng月末奶牛存栏 = sht.Cells[开始行 + 3, 正在审核的列];
                Range rng月末在产奶牛存栏 = sht.Cells[开始行 + 4, 正在审核的列];
                Range rng当月增加头数 = sht.Cells[开始行 + 5, 正在审核的列];
                Range rng当月自繁头数 = sht.Cells[开始行 + 6, 正在审核的列];
                Range rng当月自繁肉牛头数 = sht.Cells[开始行 + 7, 正在审核的列];
                Range rng当月自繁奶牛头数 = sht.Cells[开始行 + 8, 正在审核的列];
                Range rng当月购进头数 = sht.Cells[开始行 + 9, 正在审核的列];
                Range rng当月购进肉牛头数 = sht.Cells[开始行 + 10, 正在审核的列];
                Range rng当月购进奶牛头数 = sht.Cells[开始行 + 11, 正在审核的列];
                Range rng当月减少头数 = sht.Cells[开始行 + 12, 正在审核的列];
                Range rng当月自宰肉牛头数 = sht.Cells[开始行 + 13, 正在审核的列];
                Range rng当月出售肉牛头数 = sht.Cells[开始行 + 14, 正在审核的列];
                Range rng当月出售肉牛金额 = sht.Cells[开始行 + 15, 正在审核的列];
                Range rng当月出售肉牛重量 = sht.Cells[开始行 + 16, 正在审核的列];
                Range rng当月生牛奶产量 = sht.Cells[开始行 + 17, 正在审核的列];



                #region  ①出栏头重偏小 ①　若出售肉牛数量>0，出售肉牛重量/出售肉牛头数<300

                if (Convert.ToDouble( rng当月出售肉牛头数.Value) > 0 && Convert.ToDouble(rng当月出售肉牛重量.Value) / Convert.ToDouble(rng当月出售肉牛头数.Value) < 300)
                {
                    string 平均头重 = (Convert.ToDouble(rng当月出售肉牛重量.Value) / Convert.ToDouble(rng当月出售肉牛头数.Value)).ToString("F2");
                    string 错误描述 = $"[月度错误]出栏头重偏小,不足300公斤:";
                    string 具体错误 = $"{sht.Cells[开始行 - 2, 正在审核的列].Value.ToString()}出栏数为{rng当月出售肉牛头数.Value.ToString()}头,重量为{rng当月出售肉牛重量.Value.ToString()}公斤,平均头重为{平均头重}公斤";
                    ListSTR_核实性错误内容.Add(错误描述 + 具体错误);
                }

                #endregion
                #region  ②出栏头重过高②　若出售肉牛数量>0，出售肉牛重量/出售肉牛头数>700

                if (Convert.ToDouble(rng当月出售肉牛头数.Value) > 0 && Convert.ToDouble(rng当月出售肉牛重量.Value) / Convert.ToDouble(rng当月出售肉牛头数.Value) > 700)
                {
                    string 平均头重 = (Convert.ToDouble(rng当月出售肉牛重量.Value) / Convert.ToDouble(rng当月出售肉牛头数.Value)).ToString("F2");
                    string 错误描述 = $"[月度错误]出栏头重过高,超过700公斤:";
                    string 具体错误 = $"{sht.Cells[开始行 - 2, 正在审核的列].Value.ToString()}出栏数为{rng当月出售肉牛头数.Value.ToString()}头,重量为{rng当月出售肉牛重量.Value.ToString()}公斤,平均头重为{平均头重}公斤";
                    ListSTR_核实性错误内容.Add(错误描述 + 具体错误);
                }

                #endregion
                #region  ③平均单价过低③　若出售肉牛数量>0，出售肉牛金额/出售肉牛重量<15

                if (Convert.ToDouble(rng当月出售肉牛头数.Value) > 0 && Convert.ToDouble(rng当月出售肉牛金额.Value) / Convert.ToDouble(rng当月出售肉牛重量.Value) < 15)
                {
                    string 平均单价 = (Convert.ToDouble(rng当月出售肉牛金额.Value) / Convert.ToDouble(rng当月出售肉牛重量.Value)).ToString("F2");
                    string 错误描述 = $"[月度错误]平均单价过低,不足15元/公斤:";
                    string 具体错误 = $"{sht.Cells[开始行 - 2, 正在审核的列].Value.ToString()}出售金额为{rng当月出售肉牛金额.Value.ToString()}元,重量为{rng当月出售肉牛重量.Value.ToString()}公斤,平均单价为{平均单价}元/公斤";
                    ListSTR_核实性错误内容.Add(错误描述 + 具体错误);
                }

                #endregion
                #region  ④平均单价过高 ④　若出售肉牛数量>0，出售肉牛金额/出售肉牛重量>40

                if (Convert.ToDouble(rng当月出售肉牛头数.Value) > 0 && Convert.ToDouble(rng当月出售肉牛金额.Value) / Convert.ToDouble(rng当月出售肉牛重量.Value) > 40)
                {
                    string 平均单价 = (Convert.ToDouble(rng当月出售肉牛金额.Value) / Convert.ToDouble(rng当月出售肉牛重量.Value)).ToString("F2");
                    string 错误描述 = $"[月度错误]平均单价过高,超过40元/公斤:";
                    string 具体错误 = $"{sht.Cells[开始行 - 2, 正在审核的列].Value.ToString()}出售金额为{rng当月出售肉牛金额.Value.ToString()}元,重量为{rng当月出售肉牛重量.Value.ToString()}公斤,平均单价为{平均单价}元/公斤";
                    ListSTR_核实性错误内容.Add(错误描述 + 具体错误);
                }

                #endregion


            }
            //季度核实性错误审核
            Range rng核实性错误标题 = sht.Cells[this.开始行 - 2, this.核实性错误说明展示列];
            rng核实性错误标题.Value = $"第{_seasonNow.ToString()}季度核实性错误情况";
            // rng核实性错误标题.Font.Size = 10;
            Range rng核实性错误描述 = sht.Cells[this.开始行 - 1, this.核实性错误说明展示列];
            rng核实性错误描述.Value = $"第{_seasonNow.ToString()}季度核实性错误内容";
            Range rng核实性说明 = sht.Cells[this.开始行 - 1, this.核实性错误说明填写列];
            rng核实性说明.Value = $"第{_seasonNow.ToString()}季度核实性错误说明";


            Range rng季末存栏 = sht.Cells[开始行, 本季度数据所在列];
            Range rng季末肉牛存栏 = sht.Cells[开始行 + 1, 本季度数据所在列]; ;
            Range rng季末能繁殖母牛存栏 = sht.Cells[开始行 + 2, 本季度数据所在列];
            Range rng季末奶牛存栏 = sht.Cells[开始行 + 3, 本季度数据所在列];
            Range rng季末在产奶牛存栏 = sht.Cells[开始行 + 4, 本季度数据所在列];
            Range rng当季增加头数 = sht.Cells[开始行 + 5, 本季度数据所在列];
            Range rng当季自繁头数 = sht.Cells[开始行 + 6, 本季度数据所在列];
            Range rng当季自繁肉牛头数 = sht.Cells[开始行 + 7, 本季度数据所在列];
            Range rng当季自繁奶牛头数 = sht.Cells[开始行 + 8, 本季度数据所在列];
            Range rng当季购进头数 = sht.Cells[开始行 + 9, 本季度数据所在列];
            Range rng当季购进肉牛头数 = sht.Cells[开始行 + 10, 本季度数据所在列];
            Range rng当季购进奶牛头数 = sht.Cells[开始行 + 11, 本季度数据所在列];
            Range rng当季减少头数 = sht.Cells[开始行 + 12, 本季度数据所在列];
            Range rng当季自宰肉牛头数 = sht.Cells[开始行 + 13, 本季度数据所在列];
            Range rng当季出售肉牛头数 = sht.Cells[开始行 + 14, 本季度数据所在列];
            Range rng当季出售肉牛金额 = sht.Cells[开始行 + 15, 本季度数据所在列];
            Range rng当季出售肉牛重量 = sht.Cells[开始行 + 16, 本季度数据所在列];
            Range rng当季生牛奶产量 = sht.Cells[开始行 + 17, 本季度数据所在列];


            
            List<string> ListSTR_季度核实性错误内容 = new List<string>();
            //接下去先审核,并把错误写到一个集合中或字典中


            #region  ①出栏头重偏小 ①　若出售肉牛数量>0，出售肉牛重量/出售肉牛头数<300

            if (Convert.ToDouble( rng当季出售肉牛头数.Value) > 0 && Convert.ToDouble(rng当季出售肉牛重量.Value) / Convert.ToDouble(rng当季出售肉牛头数.Value) < 300)
            {
                string 平均头重 = (Convert.ToDouble(rng当季出售肉牛重量.Value) / Convert.ToDouble(rng当季出售肉牛头数.Value)).ToString("F2");
                string 错误描述 = $"[季度错误]出栏头重偏小,不足300公斤:";
                string 具体错误 = $"出栏数为{rng当季出售肉牛头数.Value.ToString()}头,重量为{rng当季出售肉牛重量.Value.ToString()}公斤,平均头重为{平均头重}公斤";
                ListSTR_季度核实性错误内容.Add(错误描述 + 具体错误);
            }

            #endregion
            #region  ②出栏头重过高 ②　若出售肉牛数量>0，出售肉牛重量/出售肉牛头数>700

            if (Convert.ToDouble(rng当季出售肉牛头数.Value) > 0 && Convert.ToDouble(rng当季出售肉牛重量.Value) / Convert.ToDouble(rng当季出售肉牛头数.Value) > 700)
            {
                string 平均头重 = (Convert.ToDouble(rng当季出售肉牛重量.Value) / Convert.ToDouble(rng当季出售肉牛头数.Value)).ToString("F2");
                string 错误描述 = $"[季度错误]出栏头重过高,超过700公斤:";
                string 具体错误 = $"出栏数为{rng当季出售肉牛头数.Value.ToString()}头,重量为{rng当季出售肉牛重量.Value.ToString()}公斤,平均头重为{平均头重}公斤";
                ListSTR_季度核实性错误内容.Add(错误描述 + 具体错误);
            }

            #endregion
            #region  ③平均单价过低 ③　若出售肉牛数量>0，出售肉牛金额/出售肉牛重量<15

            if (Convert.ToDouble(rng当季出售肉牛头数.Value) > 0 && Convert.ToDouble(rng当季出售肉牛金额.Value) / Convert.ToDouble(rng当季出售肉牛重量.Value) < 15)
            {
                string 平均单价 = (Convert.ToDouble(rng当季出售肉牛金额.Value) / Convert.ToDouble(rng当季出售肉牛重量.Value)).ToString("F2");
                string 错误描述 = $"[季度错误]平均单价过低,不足15元/公斤:";
                string 具体错误 = $"出售金额为{rng当季出售肉牛金额.Value.ToString()}元,重量为{rng当季出售肉牛重量.Value.ToString()}公斤,平均单价为{平均单价}元/公斤";
                ListSTR_季度核实性错误内容.Add(错误描述 + 具体错误);
            }

            #endregion
            #region  ④平均单价过高 若出售肉牛数量>0，出售肉牛金额/出售肉牛重量>40

            if (Convert.ToDouble(rng当季出售肉牛头数.Value) > 0 && Convert.ToDouble(rng当季出售肉牛金额.Value) / Convert.ToDouble(rng当季出售肉牛重量.Value) > 40)
            {
                string 平均单价 = (Convert.ToDouble(rng当季出售肉牛金额.Value) / Convert.ToDouble(rng当季出售肉牛重量.Value)).ToString("F2");
                string 错误描述 = $"[季度错误]平均单价过高,超过40元/公斤:";
                string 具体错误 = $"出售金额为{rng当季出售肉牛金额.Value.ToString()}元,重量为{rng当季出售肉牛重量.Value.ToString()}公斤,平均单价为{平均单价}元/公斤";
                ListSTR_季度核实性错误内容.Add(错误描述 + 具体错误);
            }

            #endregion

            #region ⑤　若当季生牛奶产量>0，当季生牛奶产量/在产奶牛数量<600。
            try
            {
                if (Convert.ToDouble(rng当季生牛奶产量.Value) > 0 && Convert.ToDouble(rng当季生牛奶产量.Value) / Convert.ToDouble(rng季末在产奶牛存栏.Value) < 600)
                {
                    string 平均奶产量 = (Convert.ToDouble(rng当季生牛奶产量.Value) / Convert.ToDouble(rng季末在产奶牛存栏.Value)).ToString("F2");
                    string 错误描述 = $"[季度错误]平均奶产量较低,平均奶产量（当季生牛奶产量/在产奶牛数量）低于600公斤:";
                    string 具体错误 = $"当季生牛奶产量{rng当季生牛奶产量.Value.ToString()}元,季末在产奶牛存栏为{rng季末在产奶牛存栏.Value}头,平均奶产量为{平均奶产量}公斤";
                    ListSTR_季度核实性错误内容.Add(错误描述 + 具体错误);
                }
            }
            catch (Exception)
            {
                ListSTR_季度核实性错误内容.Add($"[季度错误]当季有生牛奶产量,但没有在产奶牛,请核实");
            }
            #endregion
            #region ⑥　若当季生牛奶产量>0，当季生牛奶产量/在产奶牛数量>3000
            try
            {
                if (Convert.ToDouble(rng当季生牛奶产量.Value) > 0 && Convert.ToDouble(rng当季生牛奶产量.Value) / Convert.ToDouble(rng季末在产奶牛存栏.Value) > 3000)
                {
                    string 平均奶产量 = (Convert.ToDouble(rng当季生牛奶产量.Value) / Convert.ToDouble(rng季末在产奶牛存栏.Value)).ToString("F2");
                    string 错误描述 = $"[季度错误]平均奶产量较高,平均奶产量（当季生牛奶产量/在产奶牛数量）高于3000公斤:";
                    string 具体错误 = $"当季生牛奶产量{rng当季生牛奶产量.Value.ToString()}元,季末在产奶牛存栏为{rng季末在产奶牛存栏.Value}头,平均奶产量为{平均奶产量}公斤";
                    ListSTR_季度核实性错误内容.Add(错误描述 + 具体错误);
                }
            }
            catch (Exception)
            {
                //  ListSTR_季度核实性错误内容.Add($"[季度错误]当季有生牛奶产量,但没有在产奶牛,请核实");//第⑤条已经抓取过了
            }
            #endregion
            ListSTR_核实性错误内容.AddRange(ListSTR_季度核实性错误内容);
            base.核实数据输出至台账(ListSTR_核实性错误内容, sht);
            //如果都没有错误的话
        }
    }
}
